package org.travel.app.common.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author nmm
 * @date 2024-12-2024/12/9
 * @deriction 用于生成酒店订单编号的工具类
 */
@Component
public class OrderNumberGenerator {
    @Autowired
    private  RedisTemplate<String,Object> redisTemplate;

    /**
     * 用于对订单数量进行统计
     */
    private static final String CURRENT_DATE_KEY = "currentDate";

    /**
     * 用于记录上一次订单时间用于判断
     */
    private static final String ORDER_COUNT_KEY = "orderCount";
        
    public synchronized  String generateOrderNumber() {
        String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
        //获取当前时间

        String storeDate = (String) redisTemplate.opsForValue().get(CURRENT_DATE_KEY);
        //获取存储的当前日期
        String orderCountStr = (String) redisTemplate.opsForValue().get(ORDER_COUNT_KEY);
        //获取存储的订单数量
        int  orderCount=(orderCountStr!=null)?Integer.parseInt(orderCountStr):0;
        //判断当前的订单数量是否为空，是则是第一次还未将订单数量存储到redis中,往下则会进行初始化为1的if

        //如果当前日期与存储日期不同,则进行重新计数(要么是第一次，要么是日期变换)
        if (!today.equals(storeDate)) {
            redisTemplate.opsForValue().set(CURRENT_DATE_KEY,today);
            //用于初始化和当日期发生变化后同步到redis中
            orderCount = 1;
        } else {
            orderCount++;
            //如果是相同日就进行递增(相当于是记录每日的订单数量了)
        }
        redisTemplate.opsForValue().set(ORDER_COUNT_KEY,String.valueOf(orderCount));
        //更新redis中的订单计数
        return today + String.format("%02d", orderCount);
    }
}